#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdlib>

using namespace std;

#define EPS 0.000001

struct point
{
	double l, r;
}pa[20000];

int cmp(const void *a, const void *b) 
{
	point *x = (point *)a;
	point *y = (point *)b;

	if(fabs(x->l - y->l) > EPS) 
	{
		return x->l - y->l > EPS ? 1 : -1;
	} else 
	{
		return x->r - y->l > EPS ? 1 : -1;
	}
}

int main()
{
	int n, l, w;
	while(~scanf("%d%d%d", &n, &l, &w))
	{	
		int cnt = 0;
		for (int i = 0; i < n; ++i)
		{
			int p, r;
			scanf("%d%d", &p, &r);
			if(r > w / 2.0 + EPS)
			{
				double ta = sqrt(r * r * 1.0 - (w / 2.0) * (w / 2.0));
				pa[cnt].l = p * 1.0 - ta;
				pa[cnt].r = p * 1.0 + ta;
				cnt++;
			}
		}

		qsort(pa, cnt, sizeof(pa[0]), cmp);

		// for(int i = 0; i < cnt; i++) 
		// {
		// 	cout << pa[i].l << " " << pa[i].r << endl;
		// }

		double start, end;
		start = 0;
		end = 0;
		//double maxn = 0;
		int ans = 1;

		for(int i = 1; i < cnt; i++)
		{
	
			// if(pa[i].l > start) 
			//
			// 	if(end >= l || pa[i].l > end) break;
			// 	start = end;
			// 	ans++;
			// 	if(pa[i].r > end)
			// 	{
			// 		end = pa[i].r;
			// 	} 
			// }else if (pa[i].r > end)
			// {
			// 	end = pa[i].r;
			// }
			if(pa[i].l > end) 
			{
				break;
			} else if (pa[i].l <= start && pa[i].r > end) 
			{
				end = pa[i].r;
			} else if(pa[i].l > start && pa[i].r < end) 
			{
				start = end;
				end = pa[i].r;
				ans++;
			}
			                                                                                                                                                                                                                                                                                                                                                                               
		}

		printf("%d\n", pa[0].l > 0 || end < l ? -1 : ans);
	}
	return 0;
}
